热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解KMP算法及其应用

本文详细介绍了KMP算法的原理和实现方法,包括如何计算next数组以及如何利用next数组进行高效的字符串匹配。

本文将详细介绍KMP算法的核心概念和实现步骤,帮助读者更好地理解和应用这一高效字符串匹配算法。




总结不易,如果对你有帮助,请点赞关注支持一下。
微信搜索程序dunk,关注公众号,获取博主的数据结构与算法的代码笔记。




目录



  • KMP算法概述

  • KMP算法详解

    • BF(Brute Force)算法

    • KMP算法

    • 计算next数组

    • next数组的作用



  • LeetCode题目解析:28. 实现 strStr()



KMP算法概述

KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,主要用于在一个较长的文本串(主串)中查找一个较短的模式串(子串)的首次出现位置。



KMP算法详解



KMP算法的核心在于通过预处理模式串来构建一个next数组,该数组记录了模式串中每个位置的最长公共前后缀长度。这样在匹配过程中,当发生失配时,可以通过next数组快速跳过已经匹配的部分,从而提高匹配效率。



BF(Brute Force)算法



BF算法是最简单的字符串匹配算法,通过逐个字符比较的方式进行匹配。其时间复杂度为O(m*n),其中m是主串的长度,n是模式串的长度。



class Solution {
public int strStr(String haystack, String needle) {
int len1 = haystack.length();
int len2 = needle.length();
if (len2 == 0) return 0;
int l = 0;
int r = 0;
while (l if (haystack.charAt(l) == needle.charAt(r)) {
l++;
r++;
} else {
l = l - r + 1;
r = 0;
}
}
if (r == len2) {
return l - r;
}
return -1;
}
}


KMP算法



KMP算法通过构建next数组来优化匹配过程。具体步骤如下:



计算next数组



next数组用于记录模式串中每个位置的最长公共前后缀长度。通过遍历模式串并更新next数组,可以在失配时快速跳转到下一个可能的匹配位置。



private static int[] getNext(String target) {
int[] next = new int[target.length()];
int len = -1;
int y = 0;
next[0] = -1;
while (y if (len == -1 || target.charAt(len) == target.charAt(y)) {
len++;
y++;
next[y] = len;
} else {
len = next[len];
}
}
return next;
}


next数组的作用



在匹配过程中,当发生失配时,通过next数组可以快速找到下一个可能的匹配位置,从而避免重复比较已经匹配过的部分,提高匹配效率。



LeetCode题目解析:28. 实现 strStr()



题目要求实现一个函数`strStr()`,在主串`haystack`中查找模式串`needle`首次出现的位置。如果模式串为空,则返回0;如果模式串不在主串中,则返回-1。




示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2



示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1




class Solution {
public int strStr(String haystack, String needle) {
if (needle.length() == 0) return 0;
return kmpSearch(haystack, needle);
}

public int kmpSearch(String haystack, String needle) {
int[] next = getNext(needle);
int x = 0;
int y = 0;
while (x if (y == -1 || haystack.charAt(x) == needle.charAt(y)) {
x++;
y++;
} else {
y = next[y];
}
}
if (y == needle.length()) {
return x - y;
}
return -1;
}

public int[] getNext(String needle) {
int[] next = new int[needle.length()];
int len = -1;
int y = 0;
next[0] = -1;
while (y if (len == -1 || needle.charAt(len) == needle.charAt(y)) {
len++;
y++;
next[y] = len;
} else {
len = next[len];
}
}
return next;
}
}

推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Yii 实现阿里云短信发送 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
author-avatar
兴桂秀寧29
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有